package handler

import (
	"git.oschina.net/fanbuchi/redpack/constant"
	"git.oschina.net/fanbuchi/redpack/domain"
	"git.oschina.net/fanbuchi/redpack/errors"
	"git.oschina.net/fanbuchi/redpack/service"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"net/http"
	"strconv"
)


type ProfileHandler struct {
	*service.ProfileService
}


// @Summary 创建用户资料
// @Description 创建用户资料-手动调用
// @Tags profile
// @Accept  json
// @Produce  json
// @Param   profile     body    domain.Profile     true        "用户资料"
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/ [post]
func  (handler*ProfileHandler)Create(c *gin.Context)  {
	var params domain.Profile
	if err := c.ShouldBindBodyWith(&params, binding.JSON); err != nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusBadRequest,Msg:err.Error()})
		return
	}
	result,err:=handler.ProfileService.Create(&params)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:err.Error()})
		return
	}
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Data:result})
}




// @Summary 删除用户资料
// @Description 删除一个用户的资料
// @Tags profile
// @Accept  json
// @Produce  json
// @Param    id    query    int     true        "账户id" default(1)
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/delete [delete]
func  (handler*ProfileHandler)Delete(c *gin.Context)  {
	var id int64
	if err := c.ShouldBindQuery(&id);err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusBadRequest,Msg:err.Error()})
		return
	}

	_,err:=handler.ProfileService.Delete1ById(id)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:err.Error()})
		return
	}
	//密码
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Msg:"资料已删除"})
}

// @Summary 查询用户资料
// @Description QueryById 查询一个的用户资料
// @Tags profile
// @Accept  json
// @Produce  json
// @Param    id    query    int     true        "账户id" default(1)
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/query [get]
func  (handler*ProfileHandler)QueryById(c *gin.Context)  {
	id,has := c.GetQuery("id")
	params,err:=strconv.ParseInt(id,10,64)
	if !has {
		c.JSON(http.StatusOK, domain.Rsp{Status: http.StatusBadRequest, Msg: http.StatusText(http.StatusBadRequest)})
		return
	}

	result,err:=handler.ProfileService.Query1ById(params)

	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:err.Error()})
		return
	}
	if result==nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:_error.ErrAccountNotExist.Error()})
		return
	}
	accountId:=c.GetInt64(constant.AccountId)
	accountRole:=c.GetString(constant.AccountRole)
	//普通用戶不能查詢其他人的信息
	if (accountRole==domain.ROLE_USER || accountRole==domain.ROLE_SUPER_USER) &&
		result.AccountId!=accountId{
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg: _error.ErrAccountOnlyYou.Error()})
		return
	}
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Data:result})
}


// @Summary 查询个人资料
// @Description QueryByUserName 查询个人资料
// @Tags profile
// @Accept  json
// @Produce  json
// @Param    accountId    query    int     true        "accountId" default(1)
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/queryByAccountId [get]
func  (handler*ProfileHandler)QueryByAccountId(c *gin.Context)  {
	accountId:=c.GetInt64(constant.AccountId)
	result,err:=handler.ProfileService.Query1ByAccountId(accountId)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:err.Error()})
		return
	}

	accountRole:=c.GetString(constant.AccountRole)
	//普通用戶不能查詢其他人的信息
	if (accountRole==domain.ROLE_USER || accountRole==domain.ROLE_SUPER_USER) &&
		result.ID!=accountId{
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:_error.ErrAccountOnlyYou.Error()})
		return
	}
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Data:result})
}

// @Summary 条件查询用户资料
// @Description QueryByDomain 条件查询用户资料
// @Tags profile
// @Accept  json
// @Produce  json
// @Param   account     body    domain.Profile     true        "查询结构条件"
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/queryByDomain [post]
func  (handler*ProfileHandler)QueryByDomain(c *gin.Context)  {
	var req domain.Profile
	err := c.ShouldBindBodyWith(&req,binding.JSON)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusBadRequest,Msg:err.Error()})
		return
	}

	accountId:=c.GetInt64(constant.AccountId)
	accountRole:=c.GetString(constant.AccountRole)
	//普通用戶不能查詢其他人的信息
	if accountRole!=domain.ROLE_ADMIN{
		req.ID=accountId
	}
	result,err:=handler.ProfileService.Query1ByDomain(&req)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusForbidden,Msg:err.Error()})
		return
	}
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Data:result})
}


// @Summary 查询用户资料列表
// @Description search 查询用户资料列表
// @Tags profile
// @Accept  json
// @Produce  json
// @Param   profile     body    domain.Profile     true        "查询结构条件"
// @Param   page     query    int     true        "page" default(1)
// @Param   size     query    int     true        "size" default(18)
// @Param   Authorization     header    string     true        "权限认证" default(Bearer 3bbea1b6-f8e4-4da9-a9f3-0413abff47c5)
// @Success 200 {object} domain.Profile    "调用成功"
// @Failure 400 {object} domain.Rsp "失败，参数错误!"
// @Router /profile/search [post]
func  (handler*ProfileHandler)Search(c *gin.Context)  {
	page:= c.DefaultQuery("page","1")
	size:= c.DefaultQuery("size","18")

	var req domain.Profile
	err := c.ShouldBindBodyWith(&req,binding.JSON)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusBadRequest,Msg:err.Error()})
		return
	}
	accountId:=c.GetInt64(constant.AccountId)
	accountRole:=c.GetString(constant.AccountRole)
	//普通用戶不能查詢其他人的信息
	if accountRole!=domain.ROLE_ADMIN{
		req.ID=accountId
	}
	_page,_:=strconv.Atoi(page)
	_size,_:=strconv.Atoi(size)
	ret,err:=handler.ProfileService.Search(&req,_page,_size)
	if err!=nil {
		c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusBadRequest,Msg:err.Error()})
		return
	}
	c.JSON(http.StatusOK, domain.Rsp{Status:http.StatusOK,Data:ret})
}